package com.zp.self.module.level_4_算法练习.算法.动态规划;

import java.util.Arrays;

/**
 * @author By ZengPeng
 * @Description 给出 n 个数对。 在每一个数对中，第一个数字总是比第二个数字小。
 *          现在，我们定义一种跟随关系，当且仅当 b < c 时，数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
 *          给定一个数对集合，找出能够形成的最长数对链的长度。你不需要用到所有的数对，你可以以任何顺序选择其中的一些数对来构造。
 * @date in  2021/1/20 19:13
 * @Modified By
 */
public class 力扣_646_最长数对链 {
    public static void main(String[] args) {
        int[][] pairs = new int[][]{{1,2},{2,3},{3,4}};
        System.out.println(myAnswer(pairs));
        System.out.println(myAnswer2(pairs));
    }

    //动态规划
    public static int myAnswer2(int[][] pairs){
        Arrays.sort(pairs, (a, b) -> a[0] - b[0]);
        int N = pairs.length;
        int[] dp = new int[N];
        Arrays.fill(dp, 1);

        for (int j = 1; j < N; ++j) {
            for (int i = 0; i < j; ++i) {
                if (pairs[i][1] < pairs[j][0])
                    dp[j] = Math.max(dp[j], dp[i] + 1);
            }
        }

        int ans = 0;
        for (int x: dp) if (x > ans) ans = x;
        return ans;
    }

    //贪心算法 n* log n
    public static int myAnswer(int[][] pairs){
        int cur = Integer.MIN_VALUE, ans = 0;
        Arrays.sort(pairs, (a, b) -> a[1] - b[1]);
        for (int[] pair : pairs) if (cur < pair[0]) {
            cur = pair[1];
            ans++;
        }
        return ans;
    }
}
